package com.kakarote.admin.service;

import com.alibaba.fastjson.JSONObject;
import com.kakarote.core.common.enums.AdminRoleTypeEnum;
import com.kakarote.admin.entity.BO.AdminUserRoleBO;
import com.kakarote.admin.entity.PO.AdminRole;
import com.kakarote.admin.entity.VO.AdminRoleVO;
import com.kakarote.common.log.entity.OperationLog;
import com.kakarote.core.servlet.BaseService;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 角色表 服务类
 * </p>
 *
 * @author zhangzhiwei
 * @since 2020-04-27
 */
public interface IAdminRoleService extends BaseService<AdminRole> {
    /**
     * 查询用户所属权限
     *
     * @param userId 当前用户ID
     * @return obj
     */
    public JSONObject auth(Long userId);

    /**
     * 清除用户缓存
     *
     * @param userIds ids
     */
    public void authInvalidate(List<Long> userIds);

    /**
     * 通过用户ID查询角色列表
     *
     * @param userId 用户ID
     * @return data
     */
    public List<AdminRole> queryRoleListByUserId(Long userId);

    /**
     * 通过用户ID查询角色列表
     *
     * @param userIds 用户ID
     * @return data
     */
    public List<AdminRole> queryRoleListByUserId(List<Long> userIds);

    /**
     * 查询项目下角色列表
     *
     * @param roleTypeEnum
     * @param projectId
     * @return
     */
    List<AdminRole> getProjectRoleByType(AdminRoleTypeEnum roleTypeEnum, Long projectId);

    /**
     * 查询项目管理成员的权限
     *
     * @param recordList
     * @return
     */
    List<AdminRole> getAllRoleMenu(List<AdminRole> recordList);

    /**
     * 获取用户的角色
     *
     * @param userIds
     * @return
     */
    Map<Long, List<AdminRole>> getByUserIds(List<Long> userIds);

    /**
     * 根据类型查询角色
     *
     * @param roleTypeEnum type
     * @return data
     */
    public List<AdminRole> getRoleByType(AdminRoleTypeEnum roleTypeEnum);

    /**
     * 查询全部角色
     *
     * @return data
     */
    public List<AdminRoleVO> getAllRoleList();

    /**
     * 查询新增员工时的可查询角色
     *
     * @return 角色列表
     */
    public List<AdminRoleVO> getRoleList();

    /**
     * 查询数据权限
     *
     * @param userId 用户ID
     * @param menuId 菜单ID
     * @return 权限
     */
    public Integer queryDataType(Long userId, Long menuId);

    /**
     * 查询下属用户
     *
     * @param userId 用户ID
     * @param menuId 菜单ID
     * @return 权限
     */
    public Collection<Long> queryUserByAuth(Long userId, Long menuId);

    /**
     * 保存角色
     *
     * @param adminRole role
     */
    public OperationLog add(AdminRole adminRole);

    /**
     * 删除角色
     *
     * @param roleId roleId
     * @return
     */
    public OperationLog delete(Long roleId);

    /**
     * 复制角色
     *
     * @param roleId roleId
     * @return
     */
    public OperationLog copy(Long roleId);

    /**
     * 用户关联角色
     *
     * @param userIds 用户列表
     * @param roleIds 角色列表
     */
    public List<OperationLog> relatedUser(List<Long> userIds, List<Long> roleIds);


    /**
     * __________
     *
     * @param userRoleBO:用户角色实体
     * @return
     */
    public void accountUserRole(AdminUserRoleBO userRoleBO);

    /**
     * 相关部门用户
     *
     * @param userIds:用户idList
     * @param deptIds:部门idList
     * @param roleIds:角色idList
     * @return a
     */
    List<OperationLog> relatedDeptUser(List<Long> userIds, List<Long> deptIds, List<Long> roleIds);

    /**
     * 取消用户关联角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return
     */
    public OperationLog unbindingUser(Long userId, Long roleId);

    /**
     * 修改角色菜单关系
     *
     * @param adminRole adminrole
     */
    public OperationLog updateRoleMenu(AdminRole adminRole);

    /**
     * 查询项目管理的角色
     *
     * @param label label
     * @return roleId
     */
    public Long queryWorkRole(Integer label);


    /**
     * 保存项目管理角色
     *
     * @param object obj
     */
    public void setWorkRole(JSONObject object);

    /**
     * 删除项目管理角色
     *
     * @param roleId roleId
     */
    public void deleteWorkRole(Long roleId);


    /**
     * 查询角色List
     *
     * @param
     * @return
     */
    List<AdminRole> queryRoleList();

    /**
     * 查询项目管理角色
     *
     * @return
     */
    AdminRole queryDefaultRole();

    /**
     * 获取用户未授权菜单
     *
     * @param userId:用户id
     * @return data
     */
    List<String> queryNoAuthMenu(Long userId);

    /**
     * 根据用户id和角色type查询角色
     *
     * @param type:type
     * @return 角色实体
     */
    List<AdminRole> queryRoleByRoleTypeAndUserId(Integer type);

    /**
     * 跟进角色ID查询下属员工
     *
     * @param roleIds 角色ID
     * @return userIds
     */
    public List<Long> queryUserIdByRoleId(List<Long> roleIds);

    /**
     * 删除用户角色
     *
     * @param userId:用户id
     * @return
     */
    void delUserRole(Long userId);

    /**
     * 角色查询
     *
     * @param roleIds
     * @return
     */
    List<Map<String, Object>> listByRoleId(List<Long> roleIds);

    /**
     * 添加自定义项目角色和权限
     *
     * @param adminRole
     * @return
     */
    JSONObject addProjectRole(AdminRole adminRole);

    AdminRole queryRoleId(@Param("remark") String remark);

    void addRelatedDept(List<Long> deptIds, List<Long> roleIds);

    void updateRelatedDept(List<Long> deptIds, List<Long> roleIds);

    void unbindingDept(Long deptId, Long roleId);

    /**
     * 获取WP管理角色权限
     *
     * @return
     */
    JSONObject wpAuth();

    /**
     * 查询自定义的数据权限部门
     */
    List<Long> queryCustomDeptId(Long userId, Long menuId);

    /**
     * 查询人力资源自定义部门id
     * @param userId 用户ID
     * @param menuId 菜单ID
     * @return
     */
    Set<Long> queryUserCustomDeptId(Long userId, Long menuId);

    /**
     * 查询数据权限集合
     *
     * @param userId 用户ID
     * @param menuId 菜单ID
     * @return 权限
     */
    List<Integer> queryDataTypeList(Long userId, Long menuId);
}


